package org.TCC_NOVO.client.visual;

import com.google.gwt.i18n.client.DateTimeFormat;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.gwtext.client.core.EventObject;
import com.gwtext.client.core.Position;
import com.gwtext.client.data.FieldDef;
import com.gwtext.client.data.IntegerFieldDef;
import com.gwtext.client.data.Record;
import com.gwtext.client.data.RecordDef;
import com.gwtext.client.data.Store;
import com.gwtext.client.data.StringFieldDef;
import com.gwtext.client.widgets.Button;
import com.gwtext.client.widgets.MessageBox;
import com.gwtext.client.widgets.Panel;
import com.gwtext.client.widgets.Window;
import com.gwtext.client.widgets.event.ButtonListenerAdapter;
import com.gwtext.client.widgets.form.FormPanel;
import com.gwtext.client.widgets.form.TextArea;
import com.gwtext.client.widgets.grid.BaseColumnConfig;
import com.gwtext.client.widgets.grid.CheckboxColumnConfig;
import com.gwtext.client.widgets.grid.CheckboxSelectionModel;
import com.gwtext.client.widgets.grid.ColumnConfig;
import com.gwtext.client.widgets.grid.ColumnModel;
import com.gwtext.client.widgets.grid.GridPanel;
import com.gwtext.client.widgets.layout.FitLayout;
import com.gwtext.client.widgets.layout.RowLayout;
import java.util.ArrayList;
import java.util.Date;
import org.TCC_NOVO.client.GWTServiceAsync;
import org.TCC_NOVO.client.modelo.Objetivo;

public class ValidarUnidadeForm extends Window{
    private final GWTServiceAsync controller;
    ValidarUnidadePanel valUnidPanel;
    public int IDF_Unidade;
    public int IDF_Usuario;
    public int iQtdeObjetivos = 0;

    ValidarUnidadeForm self;
    ArrayList<Objetivo> arrayObjetivos = new ArrayList();
    RecordDef recordDef;
    Store store;
    CheckboxSelectionModel cbSelectionModel;
    GridPanel grid;
    Window window;
    TextArea textArea;
    //Toolbar toolbar;

    public ValidarUnidadeForm(GWTServiceAsync controller, ValidarUnidadePanel valUnidPa, int idf_unid, int idf_usua) {
        this.IDF_Unidade = idf_unid;
        this.valUnidPanel = valUnidPa;
        this.IDF_Usuario = idf_usua;
        this.controller = controller;
        this.self = this;
        this.setTitle("Objetivos da Unidade de Aprendizagem");
        this.init();
        this.setModal(true);
    }

    private void init(){
        Panel panel = new Panel();
        panel.setBorder(true);
        panel.setPaddings(2);

        cbSelectionModel = new CheckboxSelectionModel();

        recordDef = new RecordDef(new FieldDef[]{
                    new IntegerFieldDef("ID"),
                    new IntegerFieldDef("IDF_Unidade"),
                    new StringFieldDef("objetivo"),
        });
        store = new Store(recordDef);

        grid = new GridPanel();
        grid.setStore(store);

        BaseColumnConfig[] columns = new BaseColumnConfig[]{
            new CheckboxColumnConfig(cbSelectionModel),
            new ColumnConfig("Objetivos", "objetivo", 400, true),
        };

        ColumnModel columnModel = new ColumnModel(columns);
        grid.setColumnModel(columnModel);
        grid.setSelectionModel(cbSelectionModel);
        grid.setFrame(true);
        grid.setStripeRows(true);
        grid.setSize(460, 220);

        final AsyncCallback callbackUnidades = new AsyncCallback() {
            @Override
            public void onSuccess(Object result) { }
            @Override
            public void onFailure(Throwable caught) {
               MessageBox.alert("Erro ", caught.getMessage()); }
        };

        final AsyncCallback callbackOcoUnidades = new AsyncCallback() {
            @Override
            public void onSuccess(Object result) { 
                valUnidPanel.CarregarGrid();
                valUnidPanel.CarrgarGridDetalhe();
                if (window != null)
                    window.close();
                hide();
            }
            @Override
            public void onFailure(Throwable caught) {
               MessageBox.alert("Erro ", caught.getMessage()); }
        };

        final Button save = new Button();
        save.setText(" Salvar");
        save.setIcon("Images/salvar.png");
        save.setTooltip("Salvar");
        save.addListener(new ButtonListenerAdapter(){
            @Override
            public void onClick(Button button, EventObject e){
                //MessageBox.alert(Integer.toString(iQtdeObjetivos));
                Record[] records = cbSelectionModel.getSelections();
                if (iQtdeObjetivos > records.length){
                    MessageBox.confirm("Objetivos não cumpridos!", "Nem todos os objetivos da unidade foram cumpridos? ", new MessageBox.ConfirmCallback() {
                    @Override
                    public void execute(String btnID) {
                        if (btnID.equals("yes")){
                            window = new Window();
                            window.setTitle("Digite uma Observação");
                            window.setClosable(true);
                            window.setWidth(400);
                            window.setHeight(275);
                            window.setPlain(true);
                            window.setLayout(new FitLayout());

                            Panel panel = new Panel();
                            panel.setLayout(new RowLayout());

                            FormPanel formPanel = new FormPanel();
                            formPanel.setFrame(true);
                            formPanel.setWidth(380);
                            formPanel.setLabelAlign(Position.TOP);
                            textArea = new TextArea("Observação", "observacao");
                            textArea.setHeight(180);
                            textArea.setWidth(364);
                            formPanel.add(textArea);
                            panel.add(formPanel);

                            Button btnOk = new Button("Ok", new ButtonListenerAdapter() {
                                @Override
                                public void onClick(Button button, EventObject e) {
                                    if (textArea.getText().equals("")){
                                        MessageBox.alert("Necessário informar uma observação!");
                                    }else{
                                        String sSql = "update Unidade set status = 'Com Problemas' where ID = "+IDF_Unidade;
                                        controller.EditarRegistro(sSql, callbackUnidades);

                                        //Incluir ocorrencia de tarefa
                                        DateTimeFormat sdf = DateTimeFormat.getFormat("yyyy-MM-dd");

                    String DataOco = sdf.format(new Date());

                                        sSql = "insert into Ocorrencia_Unidade (IDF_Unidade, IDF_Usuario, Descricao, Data, Observacao) values "+
                                                "("+IDF_Unidade+", "+IDF_Usuario+",'Status alterado para Com Problemas'" +", '"+DataOco+ "', '"+textArea.getText()+"' )";
                                        controller.IncluirRegistro(sSql, callbackOcoUnidades);
                                    }
                                }
                            });
                            
                            Button btnCancel = new Button("Cancelar", new ButtonListenerAdapter() {
                                @Override
                                public void onClick(Button button, EventObject e) {
                                     window.close();
                                }
                            });
                            btnOk.setIcon("Images/salvar.png");
                            btnCancel.setIcon("Images/cancelar.png");

                            window.setBottomToolbar(new Button[] { btnOk, btnCancel });
                            window.add(panel);
                            window.setCloseAction(Window.CLOSE);
                            window.show(save.getId());
                        }
                        throw new UnsupportedOperationException("Not supported yet.");
                    }
                });
                }else{ //todos os objetivos foram cumpridos
                    String sSql = "update Unidade set status = 'Concluída' where ID = "+IDF_Unidade;
                    controller.EditarRegistro(sSql, callbackUnidades);

                    //Incluir ocorrencia de tarefa
                                        DateTimeFormat sdf = DateTimeFormat.getFormat("yyyy-MM-dd");

                    String DataOco = sdf.format(new Date());

                    sSql = "insert into Ocorrencia_Unidade (IDF_Unidade, IDF_Usuario, Descricao, Data, Observacao) values "+
                                   "("+IDF_Unidade+", "+IDF_Usuario+",'Status alterado para Concluída'" +", '"+DataOco+ "', '')";
                    controller.IncluirRegistro(sSql, callbackOcoUnidades);
                }
            }
        });        

        final Button cancel = new Button();
        cancel.setText(" Cancelar");
        cancel.setIcon("Images/cancelar.png");
        cancel.setTooltip("Cancelar");
        cancel.addListener(new ButtonListenerAdapter(){
            public void onClick(Button button, EventObject e){
                MessageBox.confirm("Deseja realmente sair?", "Todos os dados não submetidos serão perdidos", new MessageBox.ConfirmCallback() {
                    @Override
                    public void execute(String btnID) {
                        if (btnID.equals("yes")){
                            hide();
                        }
                        throw new UnsupportedOperationException("Not supported yet.");
                    }
                });
            }
        });

        panel.add(grid);
        panel.addButton(save);
        panel.addButton(cancel);        

        controller.RetornarDadosObjetivos("select * from Objetivo where IDF_Unidade = " + IDF_Unidade, new CallBackRetObjetivos());

        this.add(panel);
    }

    private class CallBackRetObjetivos implements AsyncCallback<ArrayList<Objetivo>> {
        public void onFailure(Throwable e) {
            MessageBox.alert("Erro ao carregar dados... ", e.getMessage());
        }
        public void onSuccess(ArrayList<Objetivo> result) {
            arrayObjetivos = result;
            CarregarDados(result);            
        }
    }

    private void CarregarDados(ArrayList<Objetivo> result) {
        iQtdeObjetivos = result.size();
        for (int i = 0; i < result.size(); ++i) {
            addRecord(result.get(i));
        }
    }

    public void addRecord(Objetivo Obj) {
        Object[] rowData = new Object[]{
            Obj.getId(),
            Obj.getIdf_unidade(),
            Obj.getDescricao(),
        };
        Record record = recordDef.createRecord(rowData[0].toString(), rowData);
        store.add(record);
    }



}
